/// 1. 当编写一个函数，但是该函数可能会失败，此时除了在函数中处理错误外，还可以将错误传递给调用者，让调用者决定如何处理，这被称为传播错误
/// 2. 传播错误的简写方式，提倡的方式
/// 3. 更进一步简写
/// 4. 什么时候用panic！， 什么时候用Result
/// panic！: 代码示例、代码原型、测试的时候使用
/// Result：在实际的项目中使用
/// 5. Option和Result
/// Option：为空的时候使用
/// Result：有异常时使用

use std::io;
use std::io::Read;
use std::fs::File;
fn read_username_from_file() -> Result<String, io::Error> {
    let f = File::open("Username.txt");
    let mut f = match f {
        Ok(file) => file,
        Err(error) => return Err(error),
    };
    let mut s = String::new();
    match f.read_to_string(&mut s) {
        Ok(_) => Ok(s),
        Err(error) => Err(error),
    }
}

// 下面方法简写
fn read_username_from_file1() -> Result<String, io::Error> {
    let mut f = File::open("Username1.txt")?;
    let mut s = String::new();
    f.read_to_string(&mut s)?;
    Ok(s)
}
// 下面方法再次简写
fn read_username_from_file2() -> Result<String, io::Error> {
    let mut s = String::new();
    File::open("Username.txt")?.read_to_string(&mut s)?;
    Ok(s)
}
fn main() {
    let r = read_username_from_file2();
    match r {
        Ok(f) => println!("{}", f),
        Err(e) => println!("error: {}", e),
    }

    let r = read_username_from_file1();
    match r {
        Ok(f) => println!("{}", f),
        Err(e) => println!("error: {}", e),
    }

    let r = read_username_from_file();
    match r {
        Ok(f) => println!("{}", f),
        Err(e) => println!("error: {}", e),
    }
    println!("Hello, world!");
}
